梦想不会自己发光,真正闪耀的是那个为梦狂奔的你。献给知行的孩子们!(Eric.He著)
本教程将从 C++ 函数的核心概念、声明定义、调用方式到作用域与变量特性,全面拆解 C++ 函数的核心用法,帮助你掌握这一编程中最基础也最重要的核心工具。
C++ 中的函数(Function)是一段封装好的、具有特定功能的可重用代码块,它接收零个或多个输入参数,执行预定的逻辑操作,可选返回一个结果。函数是程序的基本组成单元,遵循 “单一职责” 原则,一个函数只完成一个核心功能。
函数的本质是:将复杂的程序拆分为多个小的、独立的功能模块,每个模块对应一个函数,降低程序复杂度,提升代码复用性和可维护性。
calculateSum()、printInfo()),让代码逻辑更清晰;函数声明(Function Declaration)的作用是告诉编译器函数的名称、返回类型和参数类型,让编译器知道函数的“接口”,无需提供具体实现。声明不分配内存,仅做语法校验。
// 函数声明语法
返回值类型 函数名(参数类型1, 参数类型2, ...);
// 或(推荐:带参数名,增强可读性)
返回值类型 函数名(参数类型1 参数名1, 参数类型2 参数名2, ...);
// 声明一个计算两数之和的函数
int calculateSum(int a, int b);
// 声明一个无参数、无返回值的打印函数
void printHello();
// 声明一个接收字符串参数、返回布尔值的函数
bool checkString(const char* str);
函数定义(Function Definition)是函数的具体实现,包含函数的完整结构:返回类型、函数名、形式参数、函数体、返回值,编译器会为定义的函数分配内存。
返回值类型 函数名(形式参数列表) {
// 函数体:实现具体功能的代码逻辑
执行语句1;
执行语句2;
// ...
return 返回值; // 非void类型必须有返回值
}
| 组成部分 | 说明 | 示例 |
|---|---|---|
| 返回值类型 | 函数执行后返回结果的类型,无返回值则用 void |
int、float、void、bool |
| 函数名 | 函数的唯一标识,遵循标识符命名规则,见名知意 | calculateSum、printInfo |
| 形式参数(形参) | 函数接收的输入参数,包含“类型+名称”,多个参数用逗号分隔;无参数则括号内留空或写 void |
(int a, float b)、(const char* str) |
| 函数体 | 花括号包裹的代码块,实现函数的核心逻辑 | 变量定义、运算、循环、条件判断等 |
| 返回值 | 通过 return 语句返回的结果,类型必须与返回值类型一致;void 类型无需 return(或写 return;) |
return a + b;、return true; |
// 函数声明(可选:若定义在调用前,可省略声明)
int calculateSum(int num1, int num2);
// 函数定义
int calculateSum(int num1, int num2) {
// 函数体:计算两数之和
int result = num1 + num2;
// 返回值:返回计算结果
return result;
}
// 定义无返回值函数
void printHello() {
// 函数体:打印字符串
cout << "Hello, C++ Function!" << endl;
// void类型可省略return
return;
}
函数定义后需要通过“调用”才能执行,调用时需传递与形参匹配的实参(实际参数),C++ 中核心调用方式分为传值调用和传址调用。
传值调用(Pass by Value)是将实参的值拷贝一份传递给形参,形参和实参在内存中是两个独立的变量。函数内部修改形参的值,不会影响外部实参的值。
函数名(实参列表);
#include <iostream>
using namespace std;
// 传值调用函数:修改形参值
void changeValue(int x) {
x = 100; // 修改形参
cout << "函数内形参x的值:" << x << endl; // 输出:100
}
int main() {
int a = 10;
cout << "调用前实参a的值:" << a << endl; // 输出:10
// 传值调用
changeValue(a);
cout << "调用后实参a的值:" << a << endl; // 输出:10(未被修改)
return 0;
}
传址调用(Pass by Address/Reference)是将实参的内存地址传递给形参,函数内部通过地址直接操作外部实参的内存空间,修改形参等价于修改实参。核心分为“指针传址”和“引用传址”两种方式。
#include <iostream>
using namespace std;
// 指针传址函数:通过指针修改实参值
void changeValueByPtr(int* x) {
*x = 100; // 解引用,修改指针指向的内存值
cout << "函数内指针指向的值:" << *x << endl; // 输出:100
}
int main() {
int a = 10;
cout << "调用前实参a的值:" << a << endl; // 输出:10
// 指针传址:传递实参的地址
changeValueByPtr(&a);
cout << "调用后实参a的值:" << a << endl; // 输出:100(被修改)
return 0;
}
引用(&)是变量的“别名”,引用传址无需解引用,语法更简洁,是C++中首选的传址方式。
#include <iostream>
using namespace std;
// 引用传址函数:通过引用修改实参值
void changeValueByRef(int& x) {
x = 100; // 直接修改引用(等价于修改实参)
cout << "函数内引用x的值:" << x << endl; // 输出:100
}
int main() {
int a = 10;
cout << "调用前实参a的值:" << a << endl; // 输出:10
// 引用传址:直接传递变量
changeValueByRef(a);
cout << "调用后实参a的值:" << a << endl; // 输出:100(被修改)
return 0;
}
以下实例综合运用函数的声明、定义、调用,实现“学生成绩管理”的核心功能:计算平均分、判断是否及格。
#include <iostream>
#include <string>
using namespace std;
// 函数声明
float calculateAverage(float score1, float score2, float score3); // 计算平均分
bool isPass(float average); // 判断是否及格
void printResult(string name, float average, bool pass); // 打印结果
// 主函数(程序入口)
int main() {
// 输入学生信息
string name;
float chinese, math, english;
cout << "请输入学生姓名:";
cin >> name;
cout << "请输入语文成绩:";
cin >> chinese;
cout << "请输入数学成绩:";
cin >> math;
cout << "请输入英语成绩:";
cin >> english;
// 调用函数计算平均分
float avg = calculateAverage(chinese, math, english);
// 调用函数判断是否及格
bool pass = isPass(avg);
// 调用函数打印结果
printResult(name, avg, pass);
return 0;
}
// 定义:计算平均分(传值调用)
float calculateAverage(float score1, float score2, float score3) {
return (score1 + score2 + score3) / 3.0f;
}
// 定义:判断是否及格(传值调用)
bool isPass(float average) {
return average >= 60.0f;
}
// 定义:打印结果(传值调用)
void printResult(string name, float average, bool pass) {
cout << "\n===== " << name << "的成绩报告 =====" << endl;
cout << "平均分:" << average << endl;
cout << "是否及格:" << (pass ? "是" : "否") << endl;
}
请输入学生姓名:张三
请输入语文成绩:85
请输入数学成绩:90
请输入英语成绩:78
===== 张三的成绩报告 =====
平均分:84.3333
是否及格:是
作用域(Scope)是变量在程序中可被访问的范围,C++ 中变量的作用域由定义位置决定,核心分为:
全局变量(Global Variable)是定义在所有函数外部的变量,存储在全局/静态存储区,程序启动时创建,程序结束时销毁,整个程序的所有函数均可访问(同名局部变量除外)。
#include <iostream>
using namespace std;
// 定义全局变量
int globalNum = 100; // 全局作用域
void printGlobal() {
// 函数内访问全局变量
cout << "全局变量globalNum的值:" << globalNum << endl; // 输出:100
}
void modifyGlobal() {
// 函数内修改全局变量
globalNum = 200;
cout << "修改后全局变量globalNum的值:" << globalNum << endl; // 输出:200
}
int main() {
printGlobal();
modifyGlobal();
// 主函数内访问全局变量
cout << "主函数中globalNum的值:" << globalNum << endl; // 输出:200
return 0;
}
const 修饰全局变量,避免被意外修改。
局部变量(Local Variable)是定义在函数/代码块内的变量,存储在栈区,进入作用域时创建,离开作用域时自动销毁,仅在当前作用域内可访问。
#include <iostream>
using namespace std;
// 全局变量
int num = 100;
void testLocal() {
// 局部变量(与全局变量同名)
int num = 10;
// 代码块内的局部变量
{
int num = 1;
cout << "代码块内局部变量num:" << num << endl; // 输出:1(就近原则)
}
cout << "函数内局部变量num:" << num << endl; // 输出:10
// 访问全局变量(需加::作用域解析符)
cout << "全局变量num:" << ::num << endl; // 输出:100
}
int main() {
testLocal();
// 主函数内局部变量
int a = 5;
cout << "主函数内局部变量a:" << a << endl; // 输出:5
return 0;
}
本教程从 C++ 函数的核心概念到实战应用,全面拆解了函数的使用方法。掌握函数的设计与调用,是从“零散代码”到“结构化程序”的关键一步,也是后续学习面向对象、数据结构的重要基础。